#include "delay.h"

//定时器延时本质：根据时钟频率，通过计多少数达到延时多长的效果

u_int mus = 21; //1微秒计数
u_int mms = 21000; //1毫秒的计数


void Delay_Init(void)
{
	//选择系统时钟，AHB/8作为嘀嗒定时器的系统时钟频率，168MHz/8=21MHz --> 1秒钟计数21*10^6个数
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}

//24位寄存器，最大值16777216，最大微秒延时值=最大值/21 = 798915 
void delay_us(u_int nus)
{
	u_int temp=0;
	
  SysTick->LOAD = mus*nus-1; //自动重装载寄存器，计数值
	SysTick->VAL = 0; //当前值
	
	SysTick->CTRL |= (1<<0); //开启定时器
	
	do
	{
		temp = SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));//检测计数完成，十六位是否写1

	SysTick->CTRL &= ~(1<<0);  //关闭定时器
}


//最大计数值：798 -- delay_ms(500);
void delay_ms(u_int nms)
{
	u_int temp=0;
	
  SysTick->LOAD = mms*nms-1; //自动重装载寄存器，计数值
	SysTick->VAL = 0; //当前值
	
	SysTick->CTRL |= (1<<0); //开启定时器
	
	do
	{
		temp = SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));//检测计数完成，十六位是否写1

	SysTick->CTRL &= ~(1<<0);  //关闭定时器

}

//16777216 21000000
void delay_s(u_int ns)
{
	u_int i=0;
	
	for(i=0;i<ns;i++)
	{
		delay_ms(500);
	  delay_ms(500);
	}

}
